redis 主从复制
1. redis主从复制的使用场景
- 利用复制功能当主redis出现问题时,我们可以人工的切换到从redis继续提供服务,此时redis的数据和宕机时的数据几乎完全一致
- 复制功能也可用作数据备份
2. redis主从复制的原理
- 详细的解释
- 从服务器向主服务器发送 SYNC 命令
- 接到 SYNC 命令的主服务器会调用BGSAVE 命令,创建一个 RDB 文件,并使用缓冲区记录接下来执行的所有写命令
- 当主服务器执行完 BGSAVE 命令时,它会向从服务器发送 RDB 文件,而从服务器则会接收并载入这个文件
- 主服务器将缓冲区储存的所有写命令发送给从服务器执行
- 简单的解释
- 在开启主从复制的时候,使用的是RDB方式的,同步主从数据的
- 同步开始之后,通过主库命令传播的方式,主动的复制方式实现
- 2.8以后实现PSYNC的机制,实现断线重连
3. redis主从复制的架构图


4. redis主从复制的环境准备
- 准备两个或两个以上的 redis
- 创建三个redis配置文件
touch /opt/redis-4.0.10/{redis-6381.conf,redis-6382.conf,redis-6383.conf}

- 创建三个redis配置文件所需要的目录
mkdir /data/{6381,6382,6383}

- redis-6381.conf 的配置文件
vim /opt/redis-4.0.10/redis-6381.conf
# 绑定远程连接ip,如需要远程访问当前服务器的redis(即: 让别人连接你的redis),那么就需要填写当前服务器的ip -> 0.0.0.0 代表 127.0.0.1 也代表 当前服务器ip
bind 0.0.0.0
# redis 端口
port 6381
# 是否后台运行 redis,在执行 redis-server redis.conf 命令时,如果为 yes 那么就不进入阻塞状态(即: 还可以输入其他命令),如果为 no 进入阻塞状态 (即: 无法输入别的命令)
daemonize yes
# 将 redis 进程id 写入到 redis.pid 文件中,注意: /data/6381/ 目录必须存在(即: 如果没有就需要手动创建)
pidfile /data/6381/redis.pid
# 日志级别
loglevel notice
# 日志文件,注意: /data/6381/ 目录必须存在(即: 如果没有就需要手动创建)
logfile "/data/6381/redis.log"
# 是否开启安全模式,如果开启,那么redis必须设置密码才能进行连接
protected-mode no
# 配置 redis 的数据存放文件夹,一般存放redis的持久化存储文件和redis的日志文件等,注意: /data/6381/ 目录必须存在(即: 如果没有就需要手动创建)
dir /data/6381
- redis-6382.conf 的配置文件
vim /opt/redis-4.0.10/redis-6382.conf
# 绑定远程连接ip,如需要远程访问当前服务器的redis(即: 让别人连接你的redis),那么就需要填写当前服务器的ip -> 0.0.0.0 代表 127.0.0.1 也代表 当前服务器ip
bind 0.0.0.0
# redis 端口
port 6382
# 是否后台运行 redis,在执行 redis-server redis.conf 命令时,如果为 yes 那么就不进入阻塞状态(即: 还可以输入其他命令),如果为 no 进入阻塞状态 (即: 无法输入别的命令)
daemonize yes
# 将 redis 进程id 写入到 redis.pid 文件中,注意: /data/6382/ 目录必须存在(即: 如果没有就需要手动创建)
pidfile /data/6382/redis.pid
# 日志级别
loglevel notice
# 日志文件,注意: /data/6382/ 目录必须存在(即: 如果没有就需要手动创建)
logfile "/data/6382/redis.log"
# 是否开启安全模式,如果开启,那么redis必须设置密码才能进行连接
protected-mode no
# 配置 redis 的数据存放文件夹,一般存放redis的持久化存储文件和redis的日志文件等,注意: /data/6382/ 目录必须存在(即: 如果没有就需要手动创建)
dir /data/6382
- redis-6383.conf 的配置文件
vim /opt/redis-4.0.10/redis-6383.conf
# 绑定远程连接ip,如需要远程访问当前服务器的redis(即: 让别人连接你的redis),那么就需要填写当前服务器的ip -> 0.0.0.0 代表 127.0.0.1 也代表 当前服务器ip
bind 0.0.0.0
# redis 端口
port 6383
# 是否后台运行 redis,在执行 redis-server redis.conf 命令时,如果为 yes 那么就不进入阻塞状态(即: 还可以输入其他命令),如果为 no 进入阻塞状态 (即: 无法输入别的命令)
daemonize yes
# 将 redis 进程id 写入到 redis.pid 文件中,注意: /data/6383/ 目录必须存在(即: 如果没有就需要手动创建)
pidfile /data/6383/redis.pid
# 日志级别
loglevel notice
# 日志文件,注意: /data/6383/ 目录必须存在(即: 如果没有就需要手动创建)
logfile "/data/6383/redis.log"
# 是否开启安全模式,如果开启,那么redis必须设置密码才能进行连接
protected-mode no
# 配置 redis 的数据存放文件夹,一般存放redis的持久化存储文件和redis的日志文件等,注意: /data/6383/ 目录必须存在(即: 如果没有就需要手动创建)
dir /data/6383
- 同时启动三个 redis
redis-server /opt/redis-4.0.10/redis-6381.conf
redis-server /opt/redis-4.0.10/redis-6382.conf
redis-server /opt/redis-4.0.10/redis-6383.conf

- 主从规划
- 主 redis : 6381
- 从 redis : 6382、6383
5. 从 redis 的配置方式一: 以命令的方式配置从 reids
- 从 redis 配置成功后,默认只能读取数据,不能写入数据
- 从 redis : 6382 的配置
- 进入 6382 的 redis
redis-cli -p 6382
- 配置 6382 的 redis 为从身份
127.0.0.1:6382> slaveof 127.0.0.1 6381
- 查看 6382 的 redis 身份状态
redis-cli -p 6382 info replication

- 从 redis : 6383 的配置
- 进入 6383 的 redis
redis-cli -p 6383
- 配置 6383 的 redis 为从身份
127.0.0.1:6383> slaveof 127.0.0.1 6381
- 查看 6383 的 redis 身份状态
redis-cli -p 6383 info replication

6. 从 redis 的配置方式二: 以修改配置文件的形式配置从 redis
- 从 redis 配置成功后,默认只能读取数据,不能写入数据
- 从 redis : 6382 的配置文件设置
- 进入配置文件
vim /opt/redis-4.0.10/redis-6382.conf
- 修改配置文件
# 将 6381 redis 设置为当前的 6382 redis 的 主redis
slaveof 127.0.0.1 6381

- 查看 6382 的 redis 身份状态
redis-cli -p 6382 info replication

- 从 redis : 6383 的配置文件设置
- 进入配置文件
vim /opt/redis-4.0.10/redis-6383.conf
- 修改配置文件
# 将 6381 redis 设置为当前的 6383 redis 的 主redis
slaveof 127.0.0.1 6381

- 查看 6383 的 redis 身份状态
redis-cli -p 6383 info replication

7. 主 reids 的配置
- 查看 6381 的 redis 身份状态
redis-cli -p 6381 info replication

8. 测试写入数据
- 主 redis 写入数据,从 redis 查看数据是否进行了复制
- 主 redis 写入数据
127.0.0.1:6381> set name 'Kevin'
- 从 redis 查看数据是否进行了复制
127.0.0.1:6382> keys *
1) "name"
127.0.0.1:6382> get name
"Kevin"
127.0.0.1:6383> keys *
1) "name"
127.0.0.1:6383> get name
"Kevin"

9. 手动进行主从复制故障切换
- 当主 redis 6381 挂了,我想要在 6382 或 6383 redis 之间选择一个当主redis
- 关闭 主redis 6381
- 查看主redis的进程pid
ps -ef | grep redis

- 关闭主redis 6381
kill -KILL 7112
- 查看 从redis 的状态
redis-cli -p 6382 info replication

redis-cli -p 6383 info replication

- 关闭 6382 和 6383 的从库身份
redis-cli -p 6382 slaveof no one
redis-cli -p 6383 slaveof no one
- 将 6382 设置为主 redis,将 6383 设置为从 redis
redis-cli -p 6383 slaveof 127.0.0.1 6382
- 查看 6382 和 6383 的 redis 状态
redis-cli -p 6382 info replication

redis-cli -p 6383 info replication

← redis redis 发布订阅 →